from datetime import datetime
from typing import Optional
from pydantic import field_serializer
from sqlmodel import Field, SQLModel

from src.base.constants import datetime_pattern
from src.utils.common_utils import serialize_datetime


class DbBaseModel(SQLModel):
    """
    基础模型类，作为所有数据模型的父类
    包含了通用的字段和方法，如创建时间、更新时间等
    """
    __abstract__ = True  # 告诉框架这是一个抽象类，不映射为表

    class Config:
        use_enum_values = True  # 自动将枚举转换为对应值
        extra = "allow"  # 允许额外的字段

    sort: Optional[int] = Field(default=None, description="排序字段",
                                sa_column_kwargs={"comment": "排序字段", "server_default": "0"})
    status: Optional[int] = Field(default=None, description="状态", sa_column_kwargs={"comment": "状态"})
    remark: Optional[str] = Field(default=None, description="备注", sa_column_kwargs={"comment": "备注"})
    del_flag: Optional[bool] = Field(default=None, description="删除标志,0=未删除；1=删除",
                                     sa_column_kwargs={"comment": "删除标志,0=未删除；1=删除",
                                                       "server_default": "0"})
    creator: Optional[str] = Field(default=None, description="创建者", sa_column_kwargs={"comment": "创建者"})
    updater: Optional[str] = Field(default=None, description="更新者", sa_column_kwargs={"comment": "更新者"})
    create_time: Optional[datetime] = Field(default=None, description="创建时间",
                                            sa_column_kwargs={"comment": "创建时间"})
    update_time: Optional[datetime] = Field(default=None, description="更新时间",
                                            sa_column_kwargs={"comment": "更新时间"})

    @field_serializer("create_time", "update_time")
    def serialize_datetime(self, value: Optional[datetime], _info):
        """
        序列化日期时间字段的方法
        将datetime对象转换为指定格式的字符串
        :param value: datetime对象或None
        :param _info: 序列化信息
        :return: 格式化后的日期时间字符串
        """
        return serialize_datetime(value, datetime_pattern)


class TenantModel(DbBaseModel):
    __abstract__ = True  # 告诉框架这是一个抽象类，不映射为表
    tenant_id: Optional[int] = Field(default=None, description="租户ID",
                                     sa_column_kwargs={"comment": "租户ID", "server_default": "0"})
